package web.struts.util;


import java.util.Iterator;

import util.CustomExtendedProperties;

import org.apache.struts.util.MessageResourcesFactory;
import org.apache.struts.util.PropertyMessageResources;


/**
* Struts標準の<code>PropertyMessageResources</code>は内部のメッセージ保持に通常の<code>Properties</code>を利用します。
* これに対し、<code>ExtendedProperties</code>を拡張した<code>CustomExtendedProperties</code>を利用します。
* これにより、以下のような改良が施されています。
* <ul>
*   <li>プロパティファイルのエンコードをUTF-8にすることが可能です。日本語もそのまま通ります。</li>
*   <li>プロパティファイル内に"include"キーで追加ファイルを記述することにより、複数ファイルの読み込みが可能です。</li>
* </ul>
* 
* @author NDSS fushimi
*
*/
public class CustomExtendedPropertyMessageResources extends PropertyMessageResources
{
   private static final long serialVersionUID = 4929397704156239309L;


   /**
    * コンストラクタはスーパークラスのコンストラクタを呼び出すだけです。
    */
   public CustomExtendedPropertyMessageResources( MessageResourcesFactory factory, String config )
   {
       super( factory, config );
   }


   public CustomExtendedPropertyMessageResources( MessageResourcesFactory factory, String config, boolean returnNull )
   {
       super( factory, config, returnNull );
   }


   /*
    * loadLocaleメソッドでPropertiesの代わりにExtendedPropertiesを使用します。
    */
   @SuppressWarnings(
       { "unchecked" })
   protected synchronized void loadLocale( String localeKey )
   {

       if ( log.isTraceEnabled() )
       {
           log.trace( "loadLocale(" + localeKey + ")" );
       }

       // Have we already attempted to load messages for this locale?
       if ( locales.get( localeKey ) != null )
       {
           return;
       }

       locales.put( localeKey, localeKey );

       // Set up to load the property resource for this locale key, if we can
       String name = config.replace( '.', '/' );
       if ( localeKey.length() > 0 )
       {
           name += "_" + localeKey;
       }

       name += ".properties";
       // InputStream is = null;
       //CustomExtendedProperties props = new CustomExtendedProperties();

       // Load the specified property resource
       if ( log.isTraceEnabled() )
       {
           log.trace( "  Loading resource '" + name + "'" );
       }
       CustomExtendedProperties props = new CustomExtendedProperties( name );

       if ( log.isTraceEnabled() )
       {
           log.trace( "  Loading resource completed" );
       }

       // Copy the corresponding values into our cache
       if ( props.getProperties().size() < 1 )
       {
           return;
       }

       synchronized ( messages )
       {
           Iterator names = props.getProperties().keySet().iterator();
           while ( names.hasNext() )
           {
               String key = ( String ) names.next();
               if ( log.isTraceEnabled() )
               {
                   log.trace( "  Saving message key '" + messageKey( localeKey, key ) );
               }
               messages.put( messageKey( localeKey, key ), props.getProperty( key ) );
           }
       }
   }
}
